#ifndef __AT24CXX_H_
#define __AT24CXX_H_

/* =========================== 用户配置 =========================== */
#include "System/I2C/soft_i2c.h"

#define AT24C_BASE_ADDR 0x50 /* 7 位地址 << 1 */

#define AT24Cxx_I2C_ID 0

static inline void AT24Cxx_INIT(void) /* 初始化IIC */
{
    soft_i2c_init(AT24Cxx_I2C_ID);
}

static inline void AT24CXX_I2C_START(void) /* IIC起始信号 */
{
    i2c_start(AT24Cxx_I2C_ID);
}

static inline void AT24CXX_I2C_STOP(void) /* IIC停止信号 */
{
    i2c_stop(AT24Cxx_I2C_ID);
}

static inline void AT24CXX_I2C_SEND_BYTE(uint8_t data) /* IIC发送一个字节 */
{
    i2c_send_byte(AT24Cxx_I2C_ID, data);
}
static inline uint8_t AT24CXX_I2C_WAIT_ACK(void) /* IIC等待ACK */
{
    return i2c_wait_ack(AT24Cxx_I2C_ID);
}

static inline uint8_t AT24CXX_I2C_READ_BYTE(uint8_t ack) /* IIC读取一个字节 */
{
    return i2c_read_byte(AT24Cxx_I2C_ID, ack);
}

static inline void AT24CXX_DELAY_MS(uint16_t ms) /* IIC延时 */
{
    delay_ms(ms);
}

/* =========================== 外部声明 =========================== */

/* 器件容量枚举（字节） */
typedef enum
{
    AT24C01 = 128,
    AT24C02 = 256,
    AT24C04 = 512,
    AT24C08 = 1024,
    AT24C16 = 2048,
    AT24C32 = 4096,
    AT24C64 = 8192,
} at24cxx_type_t;

/* 返回值 */
typedef enum
{
    AT24CXX_OK = 0,
    AT24CXX_ERR_BUS = 1,  /* I²C 总线错误 */
    AT24CXX_ERR_ADDR = 2, /* 地址越界 */
    AT24CXX_ERR_SIZE = 3, /* 长度错误 */
} at24cxx_result_t;

/**
 * @brief       获取器件类型
 * @param       无
 * @retval      器件类型
 */
at24cxx_type_t at24cxx_get_size(void);

/**
 * @brief   器件初始化
 * @param   type: 器件类型
 * @retval  0: 成功 1: 失败
 */
uint8_t at24cxx_init(at24cxx_type_t type);

/**
 * @brief   检查器件是否正常
 * @param   mem_addr: 内部存储地址
 * @param   data: 数据
 * @retval  0: 成功 1: 失败
 */
uint8_t at24cxx_check(void);

/**
 * @brief       跨页连续写数据
 * @param       mem_addr: 内部存储地址
 * @param       buf: 数据缓冲区
 * @param       len: 数据长度
 * @retval      AT24CXX_OK: 成功 AT24CXX_ERR_XXX: 失败  AT24CXX_ERR_ADDR: 地址错误  AT24CXX_ERR_SIZE: 长度错误
 */
at24cxx_result_t at24cxx_write_bytes(uint16_t mem_addr, const uint8_t *buf, uint16_t len);
/**
 * @brief       跨页连续读数据
 * @param       mem_addr: 内部存储地址
 * @param       buf: 数据缓冲区
 * @param       len: 数据长度
 * @retval      AT24CXX_OK: 成功 AT24CXX_ERR_XXX: 失败  AT24CXX_ERR_ADDR: 地址错误  AT24CXX_ERR_SIZE: 长度错误
 */
at24cxx_result_t at24cxx_read_bytes(uint16_t mem_addr, uint8_t *buf, uint16_t len);

#endif
